package com.zw.a.basic.a09.demo07_inner;

//动物类的测试类, 用来演示: 匿名内部类入门.
/*
    匿名内部类相关介绍:
        概述:
            匿名内部类就是没有名字的 局部内部类.
            局部位置: 方法中, 或者方法的形参列表.
        格式:
            new 类名或者接口名() {
                //重写类或者接口中所有的抽象方法.
            };
        本质:
            匿名内部类就是一个继承了类或者实现了接口的匿名的子类对象.
 */
public class AnimalTest {
    public static void main(String[] args) {
        //需求: 调用Animal#eat()方法.
        //方式一: 传统做法, 搞一个Animal类的子类, 例如: Cat, 然后通过多态实现.
        Animal an = new Cat();          //子类名: Cat, 对象名叫: an
        an.eat();
        System.out.println("-----------------------");

        //方式二: 通过匿名对象实现.
        /*
            匿名对象解释:
                概述:
                    没有名字的对象, 就叫匿名对象.
                特点:
                    用完以后就会变成垃圾对象, 由GC在不确定的时间回收.
         */
        //new Cat(): 就是一个继承了Animal类的子类(Cat)的匿名对象.
        new Cat().eat();            //子类名: Cat, 对象名叫: ??
        System.out.println("-----------------------");

        //方式三: 通过匿名内部类实现.
        //匿名内部类的本质: 就是一个继承了Animal类的子类的匿名对象.
        new Animal() {               //子类名: ??, 对象名叫: ??
            //重写类或者接口中所有的抽象方法.
            @Override
            public void eat() {
                System.out.println("我是通过匿名内部类的形式创建的 Animal类的子类对象");
            }
        }.eat();
    }
}
